﻿using System.IO.Ports;
using System.Threading;
using System.Collections.Generic;
using System.Text;
using System.Windows;

namespace ISUM_V2
{
    class SerialCommunication
    {
        // 시리얼 포트
        private SerialPort _SerialPort = null;
        private MainWindow _MainWindow = null;
        private ICommunication _ICommunication = null;
        public string _InputData { get; set; }

        // 마우스 클래스 필요 private

        private bool _IsKeyBoard = false;

        public SerialCommunication ()
        {
            _SerialPort = new System.IO.Ports.SerialPort();
            _SerialPort.BaudRate = 115200;
            _SerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived);

        }

        /// <summary>
        /// 생성자(ScreenKeyboard screenKeyboard, 마우스 객체, string portNum), 초기 통신값을 마우스로설정
        /// </summary>
        /// <param name="mainWindow"> 메인 객체</param>
        /// <param name="portNum"> 포트 번호 </param>
 
        public SerialCommunication(MainWindow mainWindow, string portNum) // 마우스 객체 받아야함
        {
            // 시리얼포트 생성 및 이벤트 핸들러 등록
            this._InputData = "";
            this._MainWindow = mainWindow;
            _ICommunication = _MainWindow._ScreenMouse;
            _SerialPort = new System.IO.Ports.SerialPort(portNum);
            _SerialPort.BaudRate = 115200;
            _SerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
            //_SerialPort.WriteTimeout =3000;
            //_SerialPort.ReadTimeout = 5000;
            
        }

        public void SetPortNum(string port)
        {
           
            _SerialPort.PortName = port;
           
        }

        /// <summary>
        ///  시리얼 전송 시작
        /// </summary>
        public void SerialStart()
        {
            // 포트 열려있나 확인후 안열려 있을때 포트 염
            try
            {
                if (!_SerialPort.IsOpen)
                    _SerialPort.Open();
            }
            catch
            {
                //MessageCheck message = new MessageCheck("블루투스 상태가 좋지 않습니다.\n 다시 시도해 주십시요");
                //message.ShowDialog();
            }
        }

        /// <summary>
        /// 시리얼 종료
        /// </summary>
        public void SerialStop()
        {
            // 포트가 열려 있을때 닫음
            if (_SerialPort.IsOpen)
                _SerialPort.Close();
        }

        /// <summary>
        /// H/W에 데이타 날릴시
        /// </summary>
        /// <param name="data">전송하고자 하는 데이타 string</param>
        /// <returns>전송의 유무 </returns>
        public bool SendData(string data)
        {
            if (_SerialPort.IsOpen)
            {
                try
                {
                    _SerialPort.WriteLine(data);
                    _SerialPort.DiscardInBuffer();

                    System.Console.WriteLine("불루투스에 보내는데이타 : " + data);
                    // 포트가 열려있을때
                    // 데이터 센드, true;


                    return true;
                }
                catch (System.Exception)
                {
                    return false;
                }
            }
            // 닫혀 있다면 false
            else return false;
        }

        /// <summary>
        /// 데이터 리시브 핸들러
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="se"></param>
        private void DataReceived(object sender, SerialDataReceivedEventArgs se)
        {
            //// 시리얼 포트에서 '/n' 까지 읽어옴
            _InputData = _SerialPort.ReadLine();
            _SerialPort.DiscardInBuffer();
            _SerialPort.DiscardOutBuffer();
            
            // 테스팅용 코드
            System.Console.WriteLine("\n하드웨서 오는값 값 : " + _InputData);
            
            //// 읽어온 문자열이 4보다 작거나 없으면 버림
            if (_InputData.Equals("A+X") && _IsKeyBoard == false) // 마우스 상태에서 키보드 상태로 변환
            {
                _IsKeyBoard = true;
                _ICommunication = _MainWindow._ScreenKeyboard;
                _MainWindow.Dispatcher.BeginInvoke(new NoParamDelegate(_MainWindow._ScreenKeyboard.Show));
                _MainWindow.Dispatcher.BeginInvoke( new NoParamDelegate( _MainWindow._ScreenMouse.Hide ) );                  

            }
            else if (_InputData.Equals("A+X") && _IsKeyBoard == true) // 키보드 상태에서 마우스 상태로 변환
            {
                _IsKeyBoard = false;
                // 마우스로 바꿔야함 _ICommunication = _MainWindow.Mouseboard; 
                _ICommunication = _MainWindow._ScreenMouse;
                _MainWindow.Dispatcher.BeginInvoke( new NoParamDelegate( _MainWindow._ScreenKeyboard.Hide ) );
                _MainWindow.Dispatcher.BeginInvoke( new NoParamDelegate( _MainWindow._ScreenMouse.Show) );
            }
            else
            {
                PacketData(_InputData);
            }

            
        }

        /// <summary>
        /// ISUM만의 프로토콜 유무를 판단해주는 메서드
        /// </summary>
        /// <param name="inputdata"> 블루투스로 전송된 Packet </param>
        private void PacketData(string inputdata)
        {

            
            if (inputdata[0].Equals('A') && inputdata[inputdata.Length - 1].Equals('X') && _ICommunication != null)
            { // 앞과 끝이 'A' 와 'X'로 되어있는 패킷인가
              //  MessageBox.Show( inputdata );
                inputdata = inputdata.Remove(0, 1);
                inputdata = inputdata.Remove(inputdata.Length - 1, 1);

                _ICommunication.WriteBluetoothSignal(inputdata);

                if ( _IsKeyBoard )
                {
                    _MainWindow.Dispatcher.BeginInvoke(new NoParamDelegate( _ICommunication.WriteBluetoothAutoCompleteText));
                }
              //  MessageBox.Show( inputdata );
            }
        }

        delegate void NoParamDelegate();
        //delegate void ParamDelegate(string s);
    }
}